/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.ana.controllers;

import br.gov.ana.controllers.util.DadosEmail;
import br.gov.ana.controllers.util.JsfUtil;
import br.gov.ana.controllers.util.LocaleController;
import br.gov.ana.controllers.util.MD5;
import br.gov.ana.controllers.util.PasswordGen;
import br.gov.ana.entities.Orgao;
import br.gov.ana.entities.OrgaoUsuario;
import br.gov.ana.entities.Tecnico;
import br.gov.ana.entities.Usina;
import br.gov.ana.facade.OrgaoUsuarioFacade;
import br.gov.ana.facade.TecnicoFacade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;
import org.primefaces.model.DualListModel;

/**
 *
 * @author lucas.nunes
 */
@ManagedBean(name = "empresasSenhasController")
@SessionScoped
public class EmpresasSenhasController implements Serializable {

    @EJB
    private br.gov.ana.facade.OrgaoUsuarioFacade orgaoUsuarioFacade;
    @EJB
    private br.gov.ana.facade.TecnicoFacade tecnicoFacade;
    private List<Tecnico> tecnicos = new ArrayList<Tecnico>();
    private List<Usina> usinas = new ArrayList<Usina>();
    private List<Orgao> listaSemSenha;
    private List<Orgao> listaSenhaGerar = new ArrayList<Orgao>();
    private List<Orgao> listaSenhaRegerar;
    private DualListModel<Orgao> listaDupla;
    private Orgao current;
    private OrgaoUsuario orgaoU;
    private List<DadosEmail> listaDadosEmailGerar;
    private List<DadosEmail> listaDadosEmailRegerar;

    /**
     *
     */
    public EmpresasSenhasController() {
    }

    /**
     *
     * @return
     */
    public List<DadosEmail> getListaDadosEmail() {
        if (listaDadosEmailGerar == null) {
            listaDadosEmailGerar = new ArrayList<DadosEmail>();
        }
        return listaDadosEmailGerar;
    }

    /**
     *
     * @param listaDadosEmail
     */
    public void setListaDadosEmail(List<DadosEmail> listaDadosEmail) {
        this.listaDadosEmailGerar = listaDadosEmail;
    }

    /**
     *
     * @return
     */
    public List<DadosEmail> getListaDadosEmailRegerar() {
        if (listaDadosEmailRegerar == null) {
            listaDadosEmailRegerar = new ArrayList<DadosEmail>();
        }
        return listaDadosEmailRegerar;

    }

    /**
     *
     * @param listaDadosEmailRegerar
     */
    public void setListaDadosEmailRegerar(List<DadosEmail> listaDadosEmailRegerar) {
        this.listaDadosEmailRegerar = listaDadosEmailRegerar;
    }

    /**
     *
     */
    public void gerarSenhas() {

        List<Orgao> selecionados = listaDupla.getTarget();
        List<Tecnico> listaTecnicos;

        if (selecionados.size() > 0) {
            listaDadosEmailGerar = new ArrayList<DadosEmail>();

            for (Orgao org : selecionados) {
                listaTecnicos = tecnicoFacade.findTecnicosByOrgao(org);

                OrgaoUsuario orgaoUsuario = getOrgaoUsuarioFacade().findByUseOrgId(org);

                if (orgaoUsuario.getUseSe() == null) { // Verifica se a senha está em branco
                    if (listaTecnicos != null && listaTecnicos.size() > 0) {
                        String senha = PasswordGen.gerarSenha(8, "" + org.getOrgNm().trim().charAt(0)); // Gera a senha
                        orgaoUsuario.setUseSe(MD5.md5(senha)); //Criptografa e Seta no objeto orgaoUsuario

                        orgaoUsuarioFacade.edit(orgaoUsuario);
                        //Enviando Nova Senha por email
                        for (Tecnico tec : listaTecnicos) {
                            DadosEmail dadosEmail = new DadosEmail();
                            dadosEmail.setOrgCnpj(org.getOrgCnpj());
                            dadosEmail.setOrgNm(org.getOrgNm());
                            dadosEmail.setTecEmail(tec.getTecEmail());
                            dadosEmail.setTecNm(tec.getTecNm());
                            dadosEmail.setSenha(senha);

                            listaDadosEmailGerar.add(dadosEmail);

                            /*
                             SendMail mail = new SendMail();
                             mail.setMsg(org.getOrgNm(), tec.getTecNm(), org.getOrgCnpj(), senha);

                             try {
                             mail.sendMail("lucas.lopesdf@gmail.com", tec.getTecEmail(), ResourceBundle.getBundle("/Bundle").getString("AssuntoEmail"));

                             JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("MsgSenhaGeradaEnviadaSucesso"));
                             } catch (Exception e) {
                             JsfUtil.addErrorMessage(LocaleController.getMessage("/Bundle.properties", "MsgErroEnvio", e.getMessage()));
                             break;
                             }*/
                        }
                    } else {
                        JsfUtil.addErrorMessage(LocaleController.getMessage("/Bundle.properties", "MsgSenhaNaoGeradaEmp", org.getOrgNm()));
                    }
                }
            }

            //listaSenhaGerar = new ArrayList<Orgao>();
            listaDupla = null;
            listaSemSenha = null;
            listaSenhaRegerar = null;
            listaDupla = getListaDupla();
            //EnviaEmail
        } else {
            JsfUtil.addErrorMessage(ResourceBundle.getBundle("/Bundle").getString("MsgSelecioneEmpresaGerar"));
            listaDupla = null;
            listaSemSenha = null;
            listaSenhaRegerar = null;
            listaDupla = getListaDupla();
        }

    }

    private int random() {
        return (int) ((Math.random() * 2) * 3);
    }

    /**
     *
     */
    public void regerarSenha() {

        if (this.orgaoU != null && this.orgaoU.getUseOrgId() != null) {
            List<Tecnico> listaTecnicos;

            if (orgaoU.getUseSe() != null) { // Verifica se a senha está em branco
                listaTecnicos = tecnicoFacade.findTecnicosByOrgao(orgaoU.getUseOrgId());

                if (listaTecnicos != null && listaTecnicos.size() > 0) {
                    listaDadosEmailRegerar = new ArrayList<DadosEmail>();

                    String senha = PasswordGen.gerarSenha(8, "" + this.orgaoU.getUseOrgId().getOrgNm().trim().charAt(random())); // Gera a senha
                    orgaoU.setUseSe(MD5.md5(senha)); //Criptografa e Seta no objeto orgaoUsuario

                    orgaoUsuarioFacade.edit(orgaoU);

                    // Enviando nova senha por email;
                    // mail = new SendMail();
                    for (Tecnico tec : listaTecnicos) {
                        DadosEmail dadosEmail = new DadosEmail();
                        dadosEmail.setOrgCnpj(orgaoU.getUseOrgId().getOrgCnpj());
                        dadosEmail.setOrgNm(orgaoU.getUseOrgId().getOrgNm());
                        dadosEmail.setTecEmail(tec.getTecEmail());
                        dadosEmail.setTecNm(tec.getTecNm());
                        dadosEmail.setSenha(senha);

                        listaDadosEmailRegerar.add(dadosEmail);
                        /*
                         SendMail mail = new SendMail();
                         mail.setMsg(orgaoU.getUseOrgId().getOrgNm(), tec.getTecNm(), orgaoU.getUseOrgId().getOrgCnpj(), senha);

                         try {
                         mail.sendMail("lucas.lopesdf@gmail.com", tec.getTecEmail(), ResourceBundle.getBundle("/Bundle").getString("AssuntoEmail"));
                         JsfUtil.addSuccessMessage(LocaleController.getMessage("/Bundle.properties", "MsgSenhaRegeradaEnviadaSucesso", this.orgaoU.getUseOrgId().getOrgNm()));
                         orgaoU = null;
                         } catch (Exception e) {
                         JsfUtil.addErrorMessage(LocaleController.getMessage("/Bundle.properties", "MsgErroReenvio", e.getMessage()));
                         break;
                         }*/
                    }
                } else {
                    JsfUtil.addErrorMessage(LocaleController.getMessage("/Bundle.properties", "MsgSenhaNaoRegeradaEmp", this.orgaoU.getUseOrgId().getOrgNm()));
                }
            }
        } else {
            JsfUtil.addErrorMessage(ResourceBundle.getBundle("/Bundle").getString("MsgSelecioneEmpresaRegerar"));
            listaDupla = null;
            listaSemSenha = null;
            listaSenhaRegerar = null;
            listaDupla = getListaDupla();
        }
    }

    /**
     *
     * @return
     */
    public OrgaoUsuario getOrgaoU() {
        if (orgaoU == null) {
            orgaoU = new OrgaoUsuario();
        }
        return orgaoU;
    }

    /**
     *
     * @param orgaoU
     */
    public void setOrgaoU(OrgaoUsuario orgaoU) {
        this.orgaoU = orgaoU;
    }

    /**
     *
     * @return
     */
    public Orgao getSelected() {
        if (current == null) {
            current = new Orgao();
        }
        return current;
    }

    /**
     *
     * @param current
     */
    public void setSelected(Orgao current) {
        this.current = current;
    }

    /**
     *
     * @return
     */
    public SelectItem[] getItemsAvailableSelectOneNotNullSenha() {
        if (listaSenhaRegerar == null || orgaoUsuarioFacade.findNotNullSenha().size() != listaSenhaRegerar.size()) {
            listaSenhaRegerar = orgaoUsuarioFacade.findNotNullSenha();
            return JsfUtil.getSelectItems(orgaoUsuarioFacade.findNotNullSenha(), true);
        } else {
            return JsfUtil.getSelectItems(listaSenhaRegerar, true);
        }
    }

    /**
     *
     * @return
     */
    public List<Orgao> getListaSenhaGerar() {
        return listaSenhaGerar;
    }

    /**
     *
     * @param listaSenhaGerar
     */
    public void setListaComSenha(List<Orgao> listaSenhaGerar) {
        this.listaSenhaGerar = listaSenhaGerar;
    }

    /**
     *
     * @return
     */
    public DualListModel<Orgao> getListaDupla() {

        if (listaSemSenha != null && listaSenhaRegerar != null) {
            if (orgaoUsuarioFacade.count() != (listaSemSenha.size() + listaSenhaRegerar.size())) {
                listaDupla = null;
                listaSemSenha = null;
                listaSenhaRegerar = null;
            }
        }
        if (listaDupla == null) {
            listaDupla = new DualListModel<Orgao>(getListaSemSenha(), getListaSenhaGerar());
        }
        return listaDupla;
    }

    /**
     *
     * @param listaDupla
     */
    public void setListaDupla(DualListModel<Orgao> listaDupla) {
        this.listaDupla = listaDupla;
    }

    /**
     *
     * @return
     */
    public List<Orgao> getListaSemSenha() {
        if (listaSemSenha == null) {
            listaSemSenha = new ArrayList<Orgao>();
            listaSemSenha = orgaoUsuarioFacade.findNullSenha();
        }

        return listaSemSenha;
    }

    /**
     *
     * @param listaSemSenha
     */
    public void setListaSemSenha(List<Orgao> listaSemSenha) {
        this.listaSemSenha = listaSemSenha;
    }

    /**
     *
     * @return
     */
    public OrgaoUsuarioFacade getOrgaoUsuarioFacade() {
        return orgaoUsuarioFacade;
    }

    /**
     *
     * @param orgaoUsuarioFacade
     */
    public void setOrgaoUsuarioFacade(OrgaoUsuarioFacade orgaoUsuarioFacade) {
        this.orgaoUsuarioFacade = orgaoUsuarioFacade;
    }

    /**
     *
     * @return
     */
    public List<Orgao> getListaSenhaRegerar() {
        if (listaSenhaRegerar == null) {
            listaSenhaRegerar = new ArrayList<Orgao>();
            listaSenhaRegerar = orgaoUsuarioFacade.findNotNullSenha();
        }
        return listaSenhaRegerar;
    }

    /**
     *
     * @param listaSenhaRegerar
     */
    public void setListaSenhaRegerar(List<Orgao> listaSenhaRegerar) {
        this.listaSenhaRegerar = listaSenhaRegerar;
    }

    /**
     *
     * @return
     */
    public Orgao getCurrent() {
        return current;
    }

    /**
     *
     * @param current
     */
    public void setCurrent(Orgao current) {
        this.current = current;
    }

    /**
     *
     * @return
     */
    public TecnicoFacade getTecnicoFacade() {
        return tecnicoFacade;
    }

    /**
     *
     * @param tecnicoFacade
     */
    public void setTecnicoFacade(TecnicoFacade tecnicoFacade) {
        this.tecnicoFacade = tecnicoFacade;
    }

    /**
     *
     * @return
     */
    public List<Tecnico> getTecnicos() {
        return tecnicos;
    }

    /**
     *
     * @param tecnicos
     */
    public void setTecnicos(List<Tecnico> tecnicos) {
        this.tecnicos = tecnicos;
    }

    /**
     *
     * @return
     */
    public List<Usina> getUsinas() {
        return usinas;
    }

    /**
     *
     * @param usinas
     */
    public void setUsinas(List<Usina> usinas) {
        this.usinas = usinas;
    }
}
